package com.zhao.fishingguideserver.utils;

import java.util.regex.Pattern;

/**
 * 密码验证工具类
 * 提供密码强度校验功能
 */
public class PasswordValidator {
    
    // 至少8位，包含大小写字母、数字和特殊字符
    private static final Pattern STRONG_PASSWORD_PATTERN = Pattern.compile(
        "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$"
    );
    
    // 至少8位，包含字母和数字
    private static final Pattern MEDIUM_PASSWORD_PATTERN = Pattern.compile(
        "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d@$!%*?&]{8,}$"
    );
    
    /**
     * 验证密码强度（强）
     * @param password 密码
     * @return 是否符合强密码要求
     */
    public static boolean isStrongPassword(String password) {
        if (password == null || password.isEmpty()) {
            return false;
        }
        return STRONG_PASSWORD_PATTERN.matcher(password).matches();
    }
    
    /**
     * 验证密码强度（中等）
     * @param password 密码
     * @return 是否符合中等密码要求
     */
    public static boolean isMediumPassword(String password) {
        if (password == null || password.isEmpty()) {
            return false;
        }
        return MEDIUM_PASSWORD_PATTERN.matcher(password).matches();
    }
    
    /**
     * 验证密码基本要求（至少8位）
     * @param password 密码
     * @return 是否符合基本要求
     */
    public static boolean isValidPassword(String password) {
        return password != null && password.length() >= 8;
    }
    
    /**
     * 获取密码强度等级
     * @param password 密码
     * @return 强度等级：0-无效，1-弱，2-中等，3-强
     */
    public static int getPasswordStrength(String password) {
        if (!isValidPassword(password)) {
            return 0; // 无效
        }
        if (isStrongPassword(password)) {
            return 3; // 强
        }
        if (isMediumPassword(password)) {
            return 2; // 中等
        }
        return 1; // 弱
    }
    
    /**
     * 获取密码强度提示信息
     * @param password 密码
     * @return 提示信息
     */
    public static String getPasswordStrengthMessage(String password) {
        int strength = getPasswordStrength(password);
        switch (strength) {
            case 0:
                return "密码至少需要8位字符";
            case 1:
                return "密码强度较弱，建议包含字母和数字";
            case 2:
                return "密码强度中等，建议添加特殊字符和大小写字母";
            case 3:
                return "密码强度良好";
            default:
                return "密码无效";
        }
    }
}
